package com.ruoyi.library.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.library.api.params.TwinRelationInfo.TwinRelationInfoParams;
import com.ruoyi.library.api.query.TwinRelationInfo.TwinRelationInfoQuery;
import com.ruoyi.library.api.vo.TwinNumberStatisticsVO;
import com.ruoyi.library.api.vo.TwinRelationInfo.TwinRelationInfoVO;
import com.ruoyi.library.domain.DtsDigitalTwin;
import com.ruoyi.library.service.IDtsDigitalTwinService;
import com.ruoyi.library.api.params.DigitalTwinParams;
import com.ruoyi.library.api.query.DigitalTwinQuery;
import com.ruoyi.library.api.vo.DigitalTwinVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;

/**
 * 数字孪生体控制器
 *
 * @author YangYaPeng
 * @date 2024/05/13
 */
@Api(tags = "数字孪生体")
@RestController
@RequestMapping("/twin")
public class DtsDigitalTwinController extends BaseController {

    @Resource
    private IDtsDigitalTwinService digitalTwinService;

    /**
     * 添加数字孪生体
     *
     * @param digitalTwinParams 数字孪生体新增or修改参数
     * @return 添加信息
     */
    @ApiOperation("添加数字孪生体")
    @PostMapping("/add")
    public R<?> addDigitalTwin(@RequestBody DigitalTwinParams digitalTwinParams) {
        digitalTwinService.addDigitalTwin(digitalTwinParams);
        return R.ok();
    }

    /**
     * 删除数字孪生体
     *
     * @param id 唯一主键
     * @return 删除信息
     */
    @ApiOperation("删除数字孪生体")
    @DeleteMapping("/remove")
    public R<?> removeDigitalTwin(@RequestParam Long id) {
        digitalTwinService.removeById(id);
        return R.ok();
    }

    /**
     * 修改数字孪生体
     *
     * @param digitalTwinParams 数字孪生体新增or修改参数
     * @return 修改信息
     */
    @ApiOperation("修改数字孪生体")
    @PutMapping("/update")
    public R<?> updateDigitalTwin(@RequestBody DigitalTwinParams digitalTwinParams) {
        if (ObjectUtil.isEmpty(digitalTwinParams.getId())) {
            return R.fail("id不能为空");
        }
        DtsDigitalTwin digitalTwin = BeanUtil.copyProperties(digitalTwinParams, DtsDigitalTwin.class);
        digitalTwinService.updateById(digitalTwin);
        return R.ok();
    }

    /**
     * 根据id查询数字孪生体
     *
     * @param id 唯一主键
     * @return 数字孪生体
     */
    @ApiOperation("根据id查询数字孪生体")
    @GetMapping("/get/twin/info")
    public R<DigitalTwinVO> getTwinInfo(@RequestParam Long id) {
        DigitalTwinVO digitalTwin = digitalTwinService.getTwinInfo(id);
        return R.ok(digitalTwin);
    }

    /**
     * 数字孪生体分页
     *
     * @param digitalTwinQuery 数字孪生体查询条件
     * @return 数字孪生体分页
     */
    @ApiOperation("数字孪生体分页")
    @GetMapping("/page")
    public R<Page<DigitalTwinVO>> digitalTwinPage(DigitalTwinQuery digitalTwinQuery) {
        Page<DigitalTwinVO> digitalTwinPage = digitalTwinService.digitalTwinPage(digitalTwinQuery);
        return R.ok(digitalTwinPage);
    }

    /**
     * 数字孪生体无绑定关系的数据分页
     *
     * @param digitalTwinQuery 数字孪生体查询条件
     * @return 数字孪生体无绑定关系的数据分页
     */
    @ApiOperation("数字孪生体无绑定关系的数据分页")
    @GetMapping("/no/relation/page")
    public R<Page<DigitalTwinVO>> digitalTwinNoRelationPage(DigitalTwinQuery digitalTwinQuery) {
        Page<DigitalTwinVO> digitalTwinPage = digitalTwinService.digitalTwinNoRelationPage(digitalTwinQuery);
        return R.ok(digitalTwinPage);
    }

    /**
     * 修改状态
     *
     * @param digitalTwinParams 数字孪生体新增or修改参数
     * @return 修改信息
     */
    @ApiOperation("修改状态")
    @PutMapping("/changeStatus")
    public R<?> changeDigitalStatus(@Valid @RequestBody DigitalTwinParams digitalTwinParams) {
        digitalTwinService.updateById(DtsDigitalTwin.builder().status(digitalTwinParams.getStatus()).id(digitalTwinParams.getId()).build());
        return R.ok();
    }

    /**
     * 添加数字孪生体关联信息
     *
     * @param twinRelationInfoParams 孪生体关联信息新增or修改参数
     * @return 添加信息
     */
    @ApiOperation("添加数字孪生体关联信息")
    @PostMapping("/add/relation/info")
    public R<?> addTwinRelationInfo(@Valid @RequestBody TwinRelationInfoParams twinRelationInfoParams) {
        digitalTwinService.addTwinRelationInfo(twinRelationInfoParams);
        return R.ok();
    }

    /**
     * 删除数字孪生体关联信息
     *
     * @param twinId 孪生id
     * @return 删除信息
     */
    @ApiOperation("删除数字孪生体关联信息")
    @DeleteMapping("/delete/relation/info")
    public R<?> deleteTwinRelationInfo(@RequestParam Long twinId) {
        digitalTwinService.deleteTwinRelationInfo(twinId);
        return R.ok();
    }

    /**
     * 修改数字孪生体关联信息
     *
     * @param twinRelationInfoParams 孪生体关联信息新增or修改参数
     * @return 修改信息
     */
    @ApiOperation("修改数字孪生体关联信息")
    @PutMapping("/update/relation/info")
    public R<?> updateTwinRelationInfo(@Valid @RequestBody TwinRelationInfoParams twinRelationInfoParams) {
        digitalTwinService.updateTwinRelationInfo(twinRelationInfoParams);
        return R.ok();
    }

    /**
     * 查询数字孪生体关联信息（类）
     *
     * @param twinId 孪生id
     * @return 数字孪生体关联信息
     */
    @ApiOperation("查询数字孪生体关联信息（类）")
    @GetMapping("/get/relation/info/class")
    public R<TwinRelationInfoVO> getTwinRelationInfoClass(@RequestParam Long twinId) {
        TwinRelationInfoVO twinRelationInfo = digitalTwinService.getTwinRelationInfoClass(twinId);
        return R.ok(twinRelationInfo);
    }

    //------------------------------------------------------------------------------------------------------------------

    /**
     * 查询数字孪生体关联信息（字段）
     *
     * @param twinId 孪生id
     * @return 数字孪生体关联信息
     */
    @ApiOperation("查询数字孪生体关联信息（字段）")
    @GetMapping("/get/relation/info/field")
    public R<TwinRelationInfoVO> getTwinRelationInfoField(@RequestParam Long twinId) {
        TwinRelationInfoVO twinRelationInfo = digitalTwinService.getTwinRelationInfoField(twinId);
        return R.ok(twinRelationInfo);
    }

    //------------------------------------------------------------------------------------------------------------------

    /**
     * 数字孪生体关联信息分页
     *
     * @param twinRelationInfoQuery 孪生体关联信息查询参数
     * @return 数字孪生体关联信息分页
     */
    @ApiOperation("数字孪生体关联信息分页")
    @GetMapping("/relation/info/page")
    public R<Page<TwinRelationInfoVO>> twinRelationInfoPage(TwinRelationInfoQuery twinRelationInfoQuery) {
        Page<TwinRelationInfoVO> twinRelationInfoPage = digitalTwinService.twinRelationInfoPage(twinRelationInfoQuery);
        return R.ok(twinRelationInfoPage);
    }

    /**
     * 数字孪生体数量统计
     *
     * @return 数量统计信息
     */
    @ApiOperation("数字孪生体数量统计")
    @GetMapping("/number/statistics")
    public R<TwinNumberStatisticsVO> twinNumberStatistics() {
        TwinNumberStatisticsVO twinNumberStatistics = digitalTwinService.twinNumberStatistics();
        return R.ok(twinNumberStatistics);
    }

    /**
     * 数字孪生体数量变化趋势
     *
     * @return 数量统计信息
     */
    @ApiOperation("数字孪生体数量变化趋势")
    @GetMapping("/number/change/trend")
    public R<List<Integer>> numberChangeTrend() {
        List<Integer> numberChangeTrend = digitalTwinService.numberChangeTrend();
        return R.ok(numberChangeTrend);
    }

    /**
     * 查询数字孪生体关联信息列表
     *
     * @param twinId 孪生id
     * @return 数字孪生体关联信息列表
     */
    @ApiOperation("查询数字孪生体关联信息列表")
    @GetMapping("/get/relation/info/list")
    public R<List<TwinRelationInfoVO>> getTwinRelationInfoList(@RequestParam Long twinId) {
        List<TwinRelationInfoVO> twinRelationInfoList = digitalTwinService.getTwinRelationInfoList(twinId);
        return R.ok(twinRelationInfoList);
    }

}
